

// Horner's Method
//
int hash( String key, int tableSize ) {
		
	int hashVal = 0;

	for ( int i = 0; i < key.length(); ++i ) {
		hashVal = ( (hashVal << 16) + key.charAt( i ) ) % tableSize;
	}

	return hashVal;
}






// A string hash function that improves upon Horner's Method
//
int hash( String key, int tableSize ) {

	int hashVal = 0;

	for ( int i = 0; i < key.length(); ++i ) {
		hashVal = (hashVal * 37) + key.charAt( i );
	}

	hashVal %= tableSize;

	if ( hashVal < 0 ) {
		hashVal += tableSize;
	}

	return hashVal;
}






// Another string hash function
//
int hash( String key, int tableSize ) {
		
    int h = 0;
	
    for ( int i = 0; i < key.length(); ++i ) {
        h = (h << 4) + key.charAt( i );
        int g = h & 0xf0000000; 
        if (g != 0) {
            h = h ^ (g >> 24);
            h = h ^ g;
        }
    }
	
    return h % tableSize;
}









